#ifndef _API_SYS_H_
#define _API_SYS_H_

#define IRQ_TMR1_VECTOR                 4
#define IRQ_TMR2_VECTOR                 5
#define IRQ_IRRX_VECTOR                 6
#define IRQ_UART_VECTOR                 14
#define IRQ_TMR3_VECTOR                 16
#define IRQ_TMR4_VECTOR                 17
#define IRQ_TMR5_VECTOR                 18
#define IRQ_SPI_VECTOR                  20
#define IRQ_PORT_VECTOR                 26

typedef void (*isr_t)(void);

extern u16 tmr5ms_cnt;

void sys_set_tmr_enable(bool tmr5ms_en, bool tmr1ms_en);
u32 sys_get_rand_key(void);

void xosc_init(void);

/*
*   pr = 1, 高优先级中断, 中断入口函数isr放公共区且要加FIQ, 例如：
*   AT(.com_text.isr) FIQ
*   void timer3_isr(void) {}
*
*   pr = 0, 低优先级中断,不用加FIQ, 函数放入公共区, 例如：
*   AT(.com_text.isr)
*   void timer3_isr(void) {}
*
*   中断函数需要尽量精简，否则影响系统效率。推荐用低优先级中断，需要很高响应速度时才用高优先级中断
*/
bool sys_irq_init(int vector, int pr, isr_t isr);           //初始化一个中断, pr为优先级

u16 get_random(u16 num);                                    //获取[0, num-1]之间的随机数

#define io_output_12m(x) {fmrx_analog_init();sys_clk_output(6,x);}  //io输出12M时钟, 若使用CLKOMAP_PB0或CLKOMAP_PB1输出,需要关闭MUSIC_SDCARD_EN

//GPIO输出时钟   type: 1->xosc26m, 2->x26m_32k, 3->osc32k, 4->pll0out, 5->xosc52m, 6->12m(12m时钟复用到了fmpll,实测需要调用bsp_fmrx_init后才有时钟输出)
//mapping: {CLKOMAP_PA5,CLKOMAP_PA6,CLKOMAP_PB0,CLKOMAP_PB1,CLKOMAP_PE5,CLKOMAP_PE6}
void sys_clk_output(u32 type, u32 mapping);
void sys_clk_output_div(u8 div);                            //在sys_clk_output 输出时钟基础上还可以进行（1~31）的分频   //eg:sys_clk_output(1, CLKOMAP_PA5);printf_end("TEST_CLK");

u16 convert_uni2gbk(u16 code, u32 addr, u32 len);           //输入utf16, 返回gbk编码, 找不到编码，使用'□'
u8 utf8_char_size(u8 code);                                 //返回UTF8占用几字节
u16 utf8_convert_to_unicode(u8 *in, u8 char_size);          //UTF-8转成UTF-16 LE编码
u8 param_bt_xosc_read_api(void);
#endif // _API_SYS_H_

